# -*- coding: utf-8 -*-
from django.test import TestCase
from util import *
import datetime
from lxml import etree
from cStringIO import StringIO

class UtilTest(TestCase):
    def test_extract_delivery_date_from_text(self):
        self.assertEquals(extract_delivery_date_from_text(""), None)
        self.assertEquals(extract_delivery_date_from_text(u"Uppdraget ska redovisas senast den 31 augusti 2010."), datetime.date(2010, 8, 31))
        self.assertEquals(extract_delivery_date_from_text(u"Uppdraget skall redovisas senast den 31 augusti 2010."), datetime.date(2010, 8, 31))

        self.assertEquals(extract_delivery_date_from_text(u"Kommittén ska redovisa sitt uppdrag senast den 31 augusti 2010."), datetime.date(2010, 8, 31))
        self.assertEquals(extract_delivery_date_from_text(u"En slutredovisning av arbete ska lämnas senast den 31 december 2014"), datetime.date(2014, 12, 31))
        self.assertEquals(extract_delivery_date_from_text(u"Utredaren ska redovisa sitt uppdrag senast den 30 december 2009"), datetime.date(2009, 12, 30))
        self.assertEquals(extract_delivery_date_from_text(u"Uppdraget i övrigt ska redovisas senast den 31 december 2010"), datetime.date(2010, 12, 31))
        self.assertEquals(extract_delivery_date_from_text(u"Kommittén ska redovisa sitt uppdrag senast\nden\n31\naugusti\n2010."), datetime.date(2010, 8, 31))
        self.assertEquals(extract_delivery_date_from_text(u"Arbetet ska avslutas med en skriftlig rapport till regeringen senast den 31 oktober 2008"), datetime.date(2008, 10, 31))
        self.assertEquals(extract_delivery_date_from_text(u"Övriga delar av uppdraget ska redovisas senast den 1 november 2010"), datetime.date(2010, 11, 1))
        self.assertEquals(extract_delivery_date_from_text(u"Utredaren ska slutredovisa resultatet av sitt arbete senast den 31 mars 2010."), datetime.date(2010, 3, 31))
        self.assertEquals(extract_delivery_date_from_text(u"En slutrapport ska lämnas senast den 31 december 2008"), datetime.date(2008, 12, 31))
        self.assertEquals(extract_delivery_date_from_text(u"Utredaren ska redovisa sitt uppdrag till regeringen senast den 31 maj 2009."), datetime.date(2009, 5, 31))
        self.assertEquals(extract_delivery_date_from_text(u"Utredaren ska lämna sin slutrapport senast den 1 december 2009."), datetime.date(2009, 12, 1))
        self.assertEquals(extract_delivery_date_from_text(u"Utredaren ska redovisa resultatet av sitt arbete senast den 28 februari 2009."), datetime.date(2009, 2, 28))
        self.assertEquals(extract_delivery_date_from_text(u"Redovisningen vad gäller kvarvarande frågor ska ske senast den 31 oktober 2009"), datetime.date(2009, 10, 31))
        self.assertEquals(extract_delivery_date_from_text(u"Uppdraget i övrigt ska redovisas senast den 1 oktober 2009"), datetime.date(2009, 10, 1))
        self.assertEquals(extract_delivery_date_from_text(u"Kommittén ska redovisa sitt uppdrag, i den del det avser förslag till grundlagsändringar, senast den 31 december 2008 och i övriga delar senast den 31 december 2009."), datetime.date(2009, 12, 31))

# Tilläggsdirektiv
# ska utredningen i stället redovisa kvarvarande del av uppdraget senast den 15 november 2009
# tiden för redovisning av uppdraget i övrigt förlängs till och med den 15 maj 2009.
# Regeringen beslutar att kommitténs uppdrag ska förlängas på så sätt att redovisning ska ske senast den 28 februari 2009.
# Utredaren ska i stället redovisa sitt uppdrag senast den 30 januari 2009.
# Uppdraget ska, med ändring av tidigare angiven tidpunkt, redovisas senast den 15 december 2008.
# Utredningstiden förlängs. Frågorna om helikopter 4-systemet ska redovisas senast den 30 juni 2009.


    def test_extract_utredning_reference_from_text(self):
        self.assertEquals(extract_utredning_reference_from_text(u"I utredningen (S 2007:07)"), "S 2007:07")
        self.assertEquals(extract_utredning_reference_from_text(u"Tilläggsdirektiv till inremarknadsutredningen (UD 2008:01)"), "UD 2008:01")
        self.assertEquals(extract_utredning_reference_from_text(u"t av det tredje inre marknadspaketet för el och naturgas m.m. (N 2009:04</a>"), "N 2009:04")
        self.assertEquals(extract_utredning_reference_from_text(u"Utredningen (Fö 2009:02) Inrättande av Försvarsunderrättelsedomstolen"), u"Fö 2009:02")


    def test_extract_sfs_references_from_text(self):
        self.assertEquals(extract_sfs_references_from_text(u"Lag (1995:1649) om byggande av järnväg"), ["1995:1649"])
        self.assertEquals(extract_sfs_references_from_text(u"Lag (1995:1649) om byggande av järnväg och Plan- och bygglag (1987:10)"), ["1995:1649", "1987:10"])


    def test_extract_directive_references_from_text(self):
        self.assertEquals(extract_directive_references_from_text(u"rådets direktiv 1991/440/EEG om utveckli"), ["direktiv 1991/440/EEG"])
        self.assertEquals(extract_directive_references_from_text(u"rådets direktiv 1991/440/EEG om utveckling och Europaparlamentets och rådets direktiv 2001/14/EG om tilldelning av"), ["direktiv 1991/440/EEG", "direktiv 2001/14/EG"])


    def test_egref_to_celex(self):
        self.assertEquals(egref_to_celex("direktiv 1991/440/EEG"), "31991L0440")
        self.assertEquals(egref_to_celex("direktiv 2001/14/EG"), "32001L0014")


    def test_extract_prop_references_from_text(self):
        self.assertEquals(extract_prop_references_from_text(u"som angivits i (prop. 1981/82:142)"), ["1981/82:142"])
        self.assertEquals(extract_prop_references_from_text(u"(prop. 2007/08:95 s. 278). "), ["2007/08:95"])

    def test_lookup_utredning_rubrik_from_text(self):
        self.assertEquals(lookup_utredning_rubrik_from_text(u"bla bla\n<h1 class=\"Inhall_Rubrik1\">E-offentlighetskommittén (Ju 2008:06)</h1><style>"), u"E-offentlighetskommittén (Ju 2008:06)")

    def test_parse_first_date(self):
        self.assertEquals(parse_first_date(u"fixas 2008-01-01"), date(2008,1,1))


    def test_extract_komdir_references_from_text(self):
        self.assertEquals(extract_komdir_references_from_text(u"Direktiv för utredningen, se dir. 2008:19 och dir. 2008:113"), ["2008:19", "2008:113"])
        self.assertEquals(extract_komdir_references_from_text(u"Direktiv för utredningen, se (dir. 2008:19) och (dir. 2008:113)."), ["2008:19", "2008:113"])
        self.assertEquals(extract_komdir_references_from_text(u"Direktiv för utredningen, se (Dir. 2008:19) och (Dir. 2008:113)."), ["2008:19", "2008:113"])


    def test_find_or_create_utredning(self):
        # Sätt upp departement
        departement = Departement(code="Jo", name="Jurdbruksdepartementet")
        departement.save()

        utredning = find_or_create_utredning("Jo 2008:03")
        # Verifiera att utredning skapats med rätt koppling till departement
        self.assertEquals(utredning.departement, departement)
        self.assertTrue(len(utredning.rubrik) > 0)


    #def test_find_or_create_betankande(self):
    #    u1 = Utredning(rubrik=u"Utredningen om stärkt skydd mot åldersdiskriminering")
    #    u1.save()

    #    bet1 = find_or_create_betankande(rubrik=u"Ett utvidgat skydd mot åldersdiskriminering", nummer=u"SOU 2010:60", url="http://www.regeringen.se/sb/d/108/a/151201", utredning=u1, utgiven=datetime.date(2010, 8, 27))
    #    bet1.save()
    #    self.assertTrue(bet1.id)

    #    # Testa att det inte skapas en post till med samma nummer om betänkandet scrapas i nästa veva

        



    def test_lookup_sfs_title(self):
        self.assertEquals(lookup_sfs_title(u"2003:778"), u"Lag (2003:778) om skydd mot olyckor")
        self.assertEquals(lookup_sfs_title(u"1999:175"), u"Rättsinformationsförordning (1999:175)")
        self.assertEquals(lookup_sfs_title(u"2007:1349"), u"Förordning (2007:1349) om försöksverksamhet med gymnasial lärlingsutbildning")


    def test_find_or_create_departement(self):
        jo = Departement(code="Jo", name="Jurdbruksdepartementet")
        jo.save()
        ju = Departement(code="Ju", name="Justitiedepartementet")
        ju.save()

        self.assertEquals(find_or_create_departement("Ju Justitiedepartementet").id, ju.id)
        self.assertEquals(find_or_create_departement("Justitiedepartementet").id, ju.id)


    def test_extract_komdir_numbers_from_searchresult_dom(self):
        # sätt upp ett exempeldomträd
        content = """<td align="left" valign="top" NOWRAP><a HREF="/cgi-bin/thw?${APPL}=DIR&${BASE}=DIR&${THWIDS}=0.11/6286&amp;${HTML}=dir_dok&amp;${TRIPSHOW}=format=THW&amp;${THWURLSAVE}=11/6286">2010:52</a><a href="/main.asp">Test</a><a href="/cgi-bin/thw">Dir. 2009:1</a></td>"""
        parser = etree.HTMLParser()
        result_dom = etree.parse(StringIO(content), parser)
        self.assertEquals(["2010:52", "2009:1"], extract_komdir_numbers_from_searchresult_dom(result_dom))


    def test_extract_komdir_number_from_komdir_page(self):
        content = "<pre> Dir nr: <b>              2010:83</b> \n </pre>"
        self.assertEquals("2010:83", extract_komdir_number_from_komdir_page(content))

        content = "Dir nr: <b>              Dir. 2009:74</b> "
        self.assertEquals("2009:74", extract_komdir_number_from_komdir_page(content))
